package com.kaifamiao.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class GetField {

    public static void main(String[] args) throws Exception {

        Class<?> c = Class.forName( "com.kaifamiao.reflect.Child" );

        // 获得所有public修饰的字段组成的数组 (含从父类继承的public字段)
        Field[] fields = c.getFields();
        for( Field f : fields ){
            System.out.println( f.getName() );
            System.out.println( "\ttype: " + f.getType().getName() ); // 类型
            System.out.println( "\tmodifiers: " + Modifier.toString( f.getModifiers() )); // 修饰符
            Class<?> dc = f.getDeclaringClass(); // 获得定义字段的类
            System.out.println( "\tdeclaring class: " + dc.getName() );
        }

        System.out.println( "- ".repeat( 20 ) );

        // 获得本类中定义的所有字段(不受修饰符影响)
        fields = c.getDeclaredFields();
        for( Field f : fields ){
            System.out.println( f.getName() );
            System.out.println( "\ttype: " + f.getType().getName() ); // 类型
            System.out.println( "\tmodifiers: " + Modifier.toString( f.getModifiers() )); // 修饰符
        }

        System.out.println( "- ".repeat( 20 ) );

        // 从所有 public 字段中获得指定名称的字段 (包括从父类继承的public字段)
        Field f = c.getField( "nickname" );
        System.out.println( f );

        // 获得 c 类中直接定义的指定名称的字段 (不受访问修饰符影响)
        f = c.getDeclaredField( "alived" );
        System.out.println( f );

    }

}
